package com.thread.threadfirst.studyThread4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 8、第二种线程池：CachedThreadPool（缓存线程池）
 * 来一个任务就起一个线程，比如一个任务来了，启动一个线程，第二个任务又来了，第一个线程还在执行着，就启动第二个线程来执行新的任务，第三个任务来了，
 * 第一个线程空闲下来 就执行第三个任务，就是这样 如果有线程在空闲着 就执行任务，如果没有空闲的线程 就新起一个线程 是弹性的。上限是不能超过int类型的最大数，
 * 但一般是系统能支撑多少个线程为止，大概几万个。这么多线程太消耗系统资源了，难道就启动之后一直存在吗？不是，每个线程默认空闲超过60秒就自动销毁了，
 * 所以有个生存周期：AliveTime，当然了这个参数可以配置。
 */
public class T_ThreadPool2 {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService service = Executors.newCachedThreadPool();
        System.out.println(service);  //[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]

        for (int i = 0; i < 2; i++) {
            service.execute(() -> {
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName());
            });
        }
        System.out.println(service);  //[Running, pool size = 2, active threads = 2, queued tasks = 0, completed tasks = 0]

        TimeUnit.SECONDS.sleep(80);
        System.out.println(service);  //[Running, pool size = 2, active threads = 0, queued tasks = 0, completed tasks = 2]

        //执行完程序后1分钟程序自动关闭了，说明线程池中的线程都默认空闲60秒后自动销毁了。

    }
}
